import { defineStore } from 'pinia';
import { getUserProfile, updateUserProfile } from '@/api/user';
import { loginByPassword, loginBySms, loginByWechat } from '@/api/auth';

export const useUserStore = defineStore('user', {
  state: () => ({
    userInfo: null,
    token: uni.getStorageSync('token') || '',
    isLogin: false
  }),

  getters: {
    // 获取用户信息
    getUserInfo: (state) => state.userInfo,
    // 获取token
    getToken: (state) => state.token,
    // 获取登录状态
    getLoginStatus: (state) => state.isLogin
  },

  actions: {
    // 设置token
    setToken(token) {
      this.token = token;
      uni.setStorageSync('token', token);
    },

    // 清除token
    clearToken() {
      this.token = '';
      uni.removeStorageSync('token');
    },

    // 设置用户信息
    setUserInfo(info) {
      // 检查是否有现有用户信息
      const currentUserInfo = uni.getStorageSync('userInfo');
      
      // 如果有现有信息，并且新信息缺少一些字段，则使用现有信息中的值
      if (currentUserInfo && info) {
        // 保留的字段列表
        const preserveFields = ['avatar', 'gender', 'birthday', 'province', 'city', 'country', 'description'];
        
        preserveFields.forEach(field => {
          // 如果新信息中没有该字段或该字段为空，但现有信息中有，则使用现有信息中的值
          if ((!info[field] || info[field] === '') && currentUserInfo[field]) {
            info[field] = currentUserInfo[field];
          }
        });
      }
      
      // 更新store和localStorage
      this.userInfo = info;
      uni.setStorageSync('userInfo', info);
    },

    // 清除用户信息
    clearUserInfo() {
      this.userInfo = null;
      uni.removeStorageSync('userInfo');
    },

    // 设置登录状态
    setLoginStatus(status) {
      this.isLogin = status;
    },

    // 获取用户信息
    async fetchUserInfo() {
      try {
        const res = await getUserProfile();
        if (res.code === 200) {
          this.setUserInfo(res.data);
          return res.data;
        } else {
          throw new Error(res.message || '获取用户信息失败');
        }
      } catch (error) {
        console.error('获取用户信息失败:', error);
        // 优先显示后端返回的错误信息
        let errorMsg = '获取用户信息失败';
        if (error.response && error.response.data) {
          errorMsg = error.response.data.message || errorMsg;
        } else if (error.message) {
          errorMsg = error.message;
        }
        
        uni.showToast({
          title: errorMsg,
          icon: 'none',
          duration: 2000
        });
        throw error;
      }
    },

    // 更新用户信息
    async updateUserInfo(updateData) {
      try {
        const res = await updateUserProfile(updateData);
        if (res.code === 200) {
          // 更新本地存储和pinia中的用户信息
          // 检查res.data是否存在，有些接口可能返回成功但没有data
          if (res.data) {
            this.setUserInfo(res.data);
          } else {
            // 如果没有返回用户数据，需要重新获取用户信息
            await this.fetchUserInfo();
          }
          return res;
        } else {
          throw new Error(res.message || '更新用户信息失败');
        }
      } catch (error) {
        console.error('更新用户信息失败:', error);
        // 优先显示后端返回的错误信息
        let errorMsg = '更新用户信息失败';
        if (error.response && error.response.data) {
          errorMsg = error.response.data.message || errorMsg;
        } else if (error.message) {
          errorMsg = error.message;
        }
        
        uni.showToast({
          title: errorMsg,
          icon: 'none',
          duration: 2000
        });
        throw error;
      }
    },

    // 登录
    async login(loginData) {
      try {
        // 根据登录类型选择不同的登录方法
        let loginApi = loginData.type === 'sms' ? loginBySms : loginByPassword;
        const res = await loginApi(loginData);
        if (res.code === 200) {
          // 保存token
          this.setToken(res.data.accessToken);
          // 直接使用登录接口返回的用户信息
          this.setUserInfo(res.data.user);
          this.setLoginStatus(true);
          return res.data;
        } else {
          throw new Error(res.message || '登录失败');
        }
      } catch (error) {
        uni.showToast({
          title: error.message || '登录失败',
          icon: 'none',
          duration: 2000
        });
        throw error;
      }
    },

    // 微信登录
    async wechatLogin(code) {
      try {
        const res = await loginByWechat({code});
        console.log(res,'1111111111111');
        
        if (res.code === 200) {
          // 保存token
          this.setToken(res.data.accessToken);
          // 直接使用登录接口返回的用户信息
          this.setUserInfo(res.data.user);
          this.setLoginStatus(true);
          return res.data;
        } else {
          throw new Error(res.message || '微信登录失败');
        }
      } catch (error) {
        uni.showToast({
          title: error.message || '微信登录失败',
          icon: 'none',
          duration: 2000
        });
        throw error;
      }
    },

    // 退出登录
    logout() {
      this.clearToken();
      this.clearUserInfo();
      this.setLoginStatus(false);
    },

    // 检查登录状态
    checkLoginStatus() {
      const token = uni.getStorageSync('token');
      const userInfo = uni.getStorageSync('userInfo');
      if (token && userInfo) {
        this.setToken(token);
        this.setUserInfo(userInfo);
        this.setLoginStatus(true);
        return true;
      }
      return false;
    }
  }
}); 